آرایهها، عملیات برداری، توابع آماری و محاسبات عددی در پایتون — به همراه مثالهای متعدد و توضیحات عمیق
NumPy که مخفف Numerical Python است، هستهٔ اصلی محاسبات علمی و تحلیل داده در پایتون محسوب میشود. این کتابخانه به ما اجازه میدهد تا با آرایههای چندبعدی (N-dimensional arrays) کار کنیم و عملیات ریاضی را با سرعت فوقالعاده بالا انجام دهیم.
اگر به یادگیری ماشین، پردازش تصویر، شبیهسازیهای علمی یا هر حوزهای که با اعداد سروکار دارد علاقه دارید، اولین قدم تسلط بر NumPy است. کتابخانههای بزرگی مانند Pandas، TensorFlow، PyTorch، Scikit-learn و SciPy همگی بر پایهٔ NumPy ساخته شدهاند.
برای نصب NumPy کافی است در ترمینال یا command line خود دستور زیر را اجرا کنید:
pip install numpy
اگر از Jupyter Notebook استفاده میکنید، میتوانید از دستور %pip install numpy استفاده کنید. برای بهروزرسانی به آخرین نسخه:
pip install --upgrade numpy
import numpy as np
print(np.__version__)
اگر نسخهای مانند 1.26.4 نمایش داده شد، یعنی نصب شما درست است.
در نگاه اول، آرایه NumPy شبیه لیست پایتون به نظر میرسد، اما تفاوتهای بنیادین و مهمی دارند که در ادامه به تفصیل بررسی میکنیم.
لیست پایتون میتواند هر نوع دادهای را در کنار هم نگه دارد، اما آرایه NumPy فقط یک نوع داده خاص (مانند int, float, bool) میپذیرد. این همگنی باعث میشود حافظه به شکل پیوسته و فشرده تخصیص داده شود.
my_list = [10, 'سلام', 3.14, True] # کاملاً مجازimport numpy as np
arr = np.array([10, 20, 30, 40]) # فقط عدداگر در آرایه NumPy یک عنصر از نوع متفاوت قرار دهید، کل آرایه به آن نوع تبدیل میشود (مثلاً با قراردادن یک عدد اعشاری، کل اعداد صحیح به float تبدیل میشوند).
به دلیل پیادهسازی پایه در زبان C و استفاده از حافظه پیوسته، عملیات روی آرایههای NumPy تا ۵۰ برابر سریعتر از حلقههای پایتون است.
import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
print(a + b) # [5 7 9] بدون هیچ حلقهایآرایه NumPy حافظه بسیار کمتری مصرف میکند. به عنوان مثال، یک آرایه از یک میلیون عدد صحیح در NumPy حدود ۸ مگابایت حافظه اشغال میکند، در حالی که لیست پایتون بیش از ۳۰ مگابایت مصرف خواهد داشت.
NumPy صدها تابع آماده برای محاسبات ماتریسی، آماری، مثلثاتی، نمایی و تصادفی دارد. برای نمونه میتوان به np.mean()، np.median()، np.std()، np.dot()، np.linalg.inv() اشاره کرد.
برای ساختن آرایه دوبعدی، کافی است از لیستهای تودرتو استفاده کنیم. هر لیست داخلی یک سطر از ماتریس را مشخص میکند.
import numpy as np
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(matrix)خروجی به شکل زیر خواهد بود:
[[1 2 3] [4 5 6] [7 8 9]]
matrix[i, j] استفاده میکنیم. توجه کنید که شمارهگذاری از صفر شروع میشود.
گاهی نیاز داریم آرایههایی با مقادیر پیشفرض بسازیم. NumPy توابع بسیار مفیدی برای این منظور دارد.
np.zeros(shape) : همه عناصر را صفر قرار میدهد.np.ones(shape) : همه عناصر را یک قرار میدهد.np.full(shape, value) : همه عناصر را برابر مقدار دلخواه میکند.np.eye(N) : ماتریس همانی (قطری) N×N میسازد.import numpy as np
print('zeros:\n', np.zeros((2,3)))
print('ones:\n', np.ones((2,3)))
print('full:\n', np.full((2,2), 7))
print('eye:\n', np.eye(3))np.zeros برای مقداردهی اولیه بایاسها و از np.eye برای کدگذاری one-hot استفاده میشود.
np.where(condition, x, y) مانند یک if-else برداری عمل میکند: هر جا شرط درست بود، مقدار x و هر جا نادرست بود، مقدار y قرار میگیرد.
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
result = np.where(a > 5, a, 0)
print(result)خروجی:
[[0 0 0] [0 0 6] [7 8 9]]
میتوان از np.where برای جایگزینی مقادیر، پاکسازی دادههای پرت، یا اعمال شرطهای پیچیده استفاده کرد.
np.where(condition) ایندکسهایی که شرط در آنها True است را برمیگرداند.
ویژگی .shape ابعاد آرایه را به صورت یک تاپل نمایش میدهد. تابع reshape() نیز بدون تغییر داده، شکل آرایه را عوض میکند. شرط مهم: تعداد کل عناصر باید ثابت بماند.
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.shape) # (2, 3)b = np.arange(12)
c = b.reshape(3, 4)
print(c)استفاده از -1 در reshape به NumPy میگوید که آن بعد را خودکار محاسبه کند. مثلاً reshape(2, -1) یعنی ۲ سطر و هر تعداد ستون که لازم است.
reshape() یک view جدید برمیگرداند (در صورت امکان) و داده اصلی را کپی نمیکند. اگر میخواهید کپی مستقل داشته باشید، از .copy() استفاده کنید.
برای تبدیل یک آرایه چندبعدی به یکبعدی، دو روش اصلی وجود دارد: flatten() و ravel(). تفاوت کلیدی در این است که flatten() همیشه یک کپی جدید از داده میسازد، در حالی که ravel() در صورت امکان یک view (نمای بدون کپی) برمیگرداند که کارآمدتر است.
| ویژگی | flatten() | ravel() |
|---|---|---|
| نوع خروجی | همیشه کپی (copy) | view در صورت امکان |
| سرعت | کندتر (به دلیل کپی) | بسیار سریعتر |
| مصرف حافظه | حافظه اضافی | حداقل حافظه |
| تاثیر روی آرایه اصلی | تغییر در خروجی روی اصلی اثر ندارد | اگر view باشد، تغییر روی اصلی هم اثر میکند |
arr = np.array([[1,2,3],[4,5,6]])
print(arr.flatten())
print(arr.ravel())ravel() استفاده کنید. اگر نیاز به کپی مستقل دارید، flatten() را به کار ببرید.
vstack (vertical stack) آرایهها را روی هم (عمودی) قرار میدهد. hstack (horizontal stack) آنها را کنار هم (افقی) میچسباند.
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print('vstack:\n', np.vstack((a,b)))
print('hstack:\n', np.hstack((a,b)))خروجی vstack (۴ سطر، ۲ ستون):
[[1 2] [3 4] [5 6] [7 8]]
خروجی hstack (۲ سطر، ۴ ستون):
[[1 2 5 6] [3 4 7 8]]
np.sort() آرایه را مرتب میکند و یک کopy مرتب شده برمیگرداند (آرایه اصلی تغییر نمیکند). np.concatenate() دو یا چند آرایه را در امتداد یک محور به هم میچسباند.
import numpy as np
arr = np.array([3,1,4,2])
print(np.sort(arr)) # [1 2 3 4]a = np.array([10,20,30])
b = np.array([40,50])
print(np.concatenate((a,b))) # [10 20 30 40 50]axis=0 (عمودی) یا axis=1 (افقی) استفاده کرد.
توابع تجمیعی مانند sum(), min(), max(), mean(), std(), var() میتوانند روی کل آرایه یا روی یک محور خاص اعمال شوند. محور axis=0 به معنای حرکت در راستای سطرها (محاسبه روی ستونها) و axis=1 به معنای حرکت در راستای ستونها (محاسبه روی سطرها) است.
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print('جمع کل:', a.sum())
print('میانگین ستونها:', a.mean(axis=0))
print('انحراف معیار سطرها:', a.std(axis=1))np.linspace(start, stop, num) آرایهای از اعداد با فاصله مساوی بین start و stop ایجاد میکند. برخلاف arange() که بر اساس گام (step) کار میکند، linspace دقیقاً تعداد نقاط را کنترل میکند.
import numpy as np
a = np.linspace(0, 1, 5)
print(a) # [0. 0.25 0.5 0.75 1. ]
b = np.linspace(0, 10, 4)
print(b) # [ 0. 3.33333333 6.66666667 10. ]linspace برای تولید محور x و سپس محاسبه y استفاده میشود.
ویژگی .size تعداد کل عناصر آرایه را نشان میدهد. اما resize() میتواند ابعاد آرایه را تغییر دهد، حتی اگر تعداد عناصر تغییر کند (برخلاف reshape).
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print('اندازه:', a.size) # 6
a.resize(3,4)
print('بعد از resize:\n', a)در این جزوه، تمام مفاهیم پایه و پیشرفته NumPy را پوشش دادیم: